package com.naiterui.ehp.bp.utils.payment.bo;

import java.io.Serializable;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Length;

import lombok.Builder;
import lombok.Data;

import io.swagger.annotations.ApiModelProperty;

/**
 * 系统预支付下单
 *
 * @Date 2017年09月09日
 * @since 1.0.0
 */
@SuppressWarnings({"unused", "WeakerAccess"})
@Builder
@Data
public class UnifiedOrderRequestBO implements Serializable {

    /**
     * The constant serialVersionUID.
     */
    private static final long serialVersionUID = 6017166071844013252L;

    /**
     * <pre>
     * 字段名：订单来源平台
     * 是否必填：是
     * 类型：int
     * 示例值：1
     * 描述：订单来源平台
     * </pre>
     */
    @NotNull(message = "订单来源平台不能为null")
    @ApiModelProperty(value = "订单来源平台", required = true)
    private Integer origin;

    /**
     * <pre>
     * 字段名：订单号类型
     * 是否必填：是
     * 类型：int
     * 示例值：1
     * 描述：订单号类型
     * </pre>
     */
    @NotNull
    @Max(value = 9, message = "订单类型不能大于9")
    @Min(value = 0, message = "订单类型不能小于0")
    @ApiModelProperty(value = "订单号类型", required = true)
    private Integer orderType;

    /**
     * <pre>
     * 字段名：商户订单号
     * 是否必填：是
     * 类型：String(32)
     * 示例值：20150806125346
     * 描述：商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
     * </pre>
     */
    @NotEmpty(message = "商户订单号不能为空")
    @Length(max = 30, message = "商户订单号长度不能大于30")
    @ApiModelProperty(value = "商户订单号", required = true)
    private String orderSn;

    /**
     * 支付流水号
     */
    private String tradeSn;

    /**
     * <pre>
     * 字段名：商品描述
     * 是否必填：是
     * 类型：String(128)
     * 示例值： 腾讯充值中心-QQ会员充值
     * 描述：商品简单描述，该字段须严格按照规范传递，具体请见参数规定
     * </pre>
     */
    @NotEmpty(message = "商品描述不能为空")
    @Length(max = 128, message = "商品描述不能大于128字符")
    @ApiModelProperty(value = "商品描述", required = true)
    private String body;

    /**
     * <pre>
     * 字段名：设备号
     * 变量名：device_info
     * 是否必填：否
     * 类型：String(32)
     * 示例值：013467007045764
     * 描述：终端设备号(门店号或收银设备Id)，注意：PC网页或公众号内支付请传"WEB"
     * </pre>
     */
    @Length(max = 32)
    private String deviceInfo;

    /**
     * <pre>
     * 字段名：用户子标识
     * 是否必填：是
     * 类型：String(128)
     * 示例值：oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
     * 描述：trade_type=JSAPI，此参数必传，用户在子商户appid下的唯一标识。
     * openid和sub_openid可以选传其中之一，如果选择传sub_openid,则必须传sub_appid。
     * 下单前需要调用【网页授权获取用户信息】接口获取到用户的Openid。
     * </pre>
     */
    @NotEmpty(message = "用户OPEN id不能为空")
    @Length(max = 128, message = "open id 不能超过128字符")
    @ApiModelProperty(value = "用户子标识", required = true)
    private String openId;

    /**
     * <pre>
     * 字段名：总金额
     * 变量名：total_fee
     * 是否必填：是
     * 类型：Int
     * 示例值： 888
     * 描述：订单总金额，单位为分，详见支付金额
     * </pre>
     */
    @NotNull(message = "订单金额不能为空")
    @Min(value = 1, message = "订单金额最少是1分钱")
    @ApiModelProperty(value = "订单总金额，单位为分", required = true)
    private Integer totalFee;

    /**
     * <pre>
     * 字段名：终端IP
     * 是否必填：是
     * 类型：String(16)
     * 示例值：123.12.12.123
     * 描述：APP和网页支付提交用户端ip，Native支付填调用微信支付API的机器IP。
     * </pre>
     */
    @NotEmpty(message = "用户IP不能为空")
    @Length(max = 16, message = "请输入正确用户IP")
    @ApiModelProperty(value = "终端IP", required = true)
    private String ip;

    /**
     * <pre>
     * 字段名：通知地址
     * 是否必填：是
     * 类型：String(256)
     * 示例值：http://www.weixin.qq.com/wxpay/pay.php
     * 描述：接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
     * </pre>
     */
    @Length(max = 256)
    @ApiModelProperty(value = "通知地址")
    private String notifyUrl;

    /**
     * <pre>
     * 字段名：通知业务系统地址
     * 是否必填：是
     * 类型：String(256)
     * 描述：接收支付系统异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
     * </pre>
     */
    @Length(max = 256)
    @NotEmpty(message = "业务通知地址不能为null")
    @ApiModelProperty(value = "通知业务系统地址")
    private String notifyBusinessUrl;

}
